package ch04.homoAST;

import java.lang.String;
import java.util.ArrayList;
import java.util.List;

public class AST {
    Token token;            // 原始词法单元
    List<AST> children;     // 规范化子节点列表

    /**
     * 创建作为根节点的空节点
     */
    public AST() {

    }

    public AST(Token token) {
        this.token = token;
    }

    /**
     * 根据词法单元类型创建节点，主要用于虚节点
     * @param tokenType
     */
    public AST(int tokenType) {
        this.token = new Token(tokenType);
    }


    /**
     * 对于同一类型的节点，外部访问者会执行同样的代码
     * @return
     */
    public int getNodeType() {
        return token.type;
    }


    public void addChild(AST t) {
        if (children == null) {
            children = new ArrayList<AST>();
        }
        children.add(t);
    }

    public boolean isNil() {
        return token == null;
    }

    /**
     * 生成单个节点的文本形式
     * @return
     */
    public java.lang.String toString() {
        return token != null ? token.toString() : "nil";
    }

    public String toStringTree() {
        if (children == null || children.size() == 0) {
            return this.toString();
        }
        StringBuilder buf = new StringBuilder();
        if (!isNil()) {
            buf.append("(");
            buf.append(this.toString());
            buf.append(' ');
        }
        for (int i = 0; i < children.size(); i++) {
            AST t = (AST)children.get(i);               // 规范化的子节点列表，因此节点没有名称
            if (i > 0) {
                buf.append(' ');
            }
            buf.append(t.toStringTree());
        }
        if (!isNil()) {
            buf.append(")");
        }
        return buf.toString();
    }
}

